package bancosys.tec.services.input.exceptions;

import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import jmine.tec.services.impl.ServicesImplMessages;
import bancosys.tec.component.AbstractComponentException;
import bancosys.tec.exception.LocalizedMessageHolder;

/**
 * Exception lancada caso ocorra algum erro durante a leitura de dados informados pelo usuario.
 * 
 * @author Rafael Volpato (Jun 26, 2007)
 */
public class InputException extends AbstractComponentException {

    private final List<InputError> errors = new ArrayList<InputError>();

    /**
     * C'tor
     * 
     * @param prefix prefixo da mensagem de erro
     * @param message message
     * @param cause a CAUSA desta exception.
     */
    public InputException(String prefix, LocalizedMessageHolder message, Throwable cause) {
        super(new InputError(prefix, message), cause);
        this.errors.add(new InputError(prefix, message));

        if (cause != null && cause instanceof InputException) {
            this.errors.addAll(((InputException) cause).getErrors());
        }
    }

    /**
     * C'tor
     * 
     * @param prefix prefixo da mensagem de erro
     * @param message message
     */
    public InputException(String prefix, LocalizedMessageHolder message) {
        super(new InputError(prefix, message));
        this.errors.add(new InputError(prefix, message));
    }

    /**
     * @return the errors
     */
    public List<InputError> getErrors() {
        return this.errors;
    }

    /**
     * Adiciona uma lista de erros.
     * 
     * @param newErrors nova lista de erros
     */
    public void addErrors(List<InputError> newErrors) {
        this.errors.addAll(newErrors);
    }

    /**
     * Retorna a mensagem convertida no default locale. Caso não seja possível, devolve a chave.
     * 
     * @param locale Locale
     * @return A mensagem ou a chave.
     */
    @Override
    public String getMessage(Locale locale) {
        StringBuilder sb = new StringBuilder();
        sb.append(this.getHeaderMessage(locale));
        for (InputError error : this.errors) {
            sb.append("\n\t");
            sb.append(error.getMessage(locale));
        }
        return sb.toString();
    }

    /**
     * Returns the header message, on the given locale
     * 
     * @param locale locale
     * @return Message
     */
    private String getHeaderMessage(Locale locale) {
        return ServicesImplMessages.INPUT_ERRORS_FOUND.create().getMessage(locale);
    }
}